package 每日一题;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 会玩的洋洋
 * https://leetcode-cn.com/problems/where-will-the-ball-fall/
 */
public class _1706_球会落何处 {
    /**
     * 对列进行遍历，将 该列的 1 或 -1 与 一个指针 相加 最后得捣最终结果 存入数组即可
     * @param grid 二维网格箱子
     * @return int[] ans 掉落位置
     */
    public int[] findBall(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[] ans = new int[n];
        for (int i = 0; i < n; i++) {
            int loc = i;
            for (int[] ints : grid) {
                int temp = ints[loc];
                loc += temp;

                // 判断 loc 是否到达侧边 或者 呈现V型
                if (loc < 0 || loc == n || ints[loc] != temp) {
                    loc = -1;
                    break;
                }
            }
            ans[i] = loc;
        }
        return ans;
    }

    public int[] intersect(int[] nums1, int[] nums2) {
        // 将 nums1 置为数量大的 nums2 置为数量小的
        if (nums1.length < nums2.length) {
            return intersect(nums2, nums1);
        }
        Map<Integer, Integer> hash = new HashMap<>();
        // 将数量最多的数组存入 HashMap 中，记录出现的次数
        for (int num : nums1) {
            hash.put(num, hash.getOrDefault(num, 0) + 1);
        }
        int[] ans = new int[nums2.length];
        int index = 0;
        // 对数量少的数组 进行遍历查找哈希表的操作，然后将 数量 - 1
        // 若数量为 0 或者 哈希表中没有该值，则不存入ans数组
        for (int value : nums2) {
            Integer count = hash.get(value);
            if (count != null && count != 0) {
                hash.put(value, count - 1);
                ans[index++] = value;
            }
        }
        // Arrays API 将数组缩小到指定范围
        return Arrays.copyOfRange(ans, 0, index);
    }

}
